home *** CD-ROM | disk | FTP | other *** search
/ Aminet 24 / Aminet 24 (1998)(GTI - Schatztruhe)[!][Apr 1998].iso / Aminet / dev / e / AEPD24.lha / EPD24 / Amiga_E-Programme / AG2TXT / AG2TXT20.e < prev    next >
Text File  |  1994-08-16  |  7KB  |  307 lines

  1. /* AmigaGuide to Text converter (v2). Copyright (c) 1994, Jason R. Hulance */
  2. /* E version.  For AmigaDos 2.0+.  Uses Michael Zucchi's excellent 'async' */
  3. /* module that comes with E v3.0 to get a 1/3 speed up over the AmigaDOS   */
  4. /* buffered I/O functions. (Would be good if 'async' handled output, too.) */
  5.  
  6. OPT OSVERSION=37
  7.  
  8. MODULE 'utility', 'tools/async', 'dos/stdio'
  9.  
  10. ENUM N_INIT, N_OUT, N_IN, NODE_STATES
  11. ENUM L_INIT, L_QUOTED, L_SPACED, LINE_STATES
  12. ENUM A_INIT, A_AT, A_BRAC, A_IGNORE, A_END, AT_STATES
  13. ENUM NO_ERR, ERR_FILE, ERR_LIB, ERR_DATA, ERR_BRK, NUM_ERRS
  14.  
  15. CONST MAX_LINE_LEN=1024, MAX_WIDTH=120, CMP_EQUAL=0
  16.  
  17. RAISE ERR_LIB  IF OpenLibrary()=NIL
  18.  
  19. DEF in[MAX_LINE_LEN]:ARRAY, outh=NIL
  20.  
  21. ENUM        BOLD,     ITALIC,     F_LINK,       TITLE,  HIGHLIGHT,  OTHER
  22.  
  23. PROC write_ansi(type, on=TRUE)
  24.   DEF ansi:PTR TO LONG
  25.   /*        BOLD      ITALIC      F_LINK        TITLE   HIGHLIGHT   OTHER */
  26.   IF on
  27.     ansi:=['\e[1m',  '\e[3m',  '\e[1m\e[3m',   '\e[7m',  '\e[1m',  '\e[1m']
  28.   ELSE
  29.     ansi:=['\e[22m', '\e[23m', '\e[23m\e[22m', '\e[0m', '\e[22m', '\e[22m']
  30.   ENDIF
  31.   Fputs(outh, ansi[type])
  32. ENDPROC
  33.  
  34. PROC main() HANDLE
  35.   DEF fh, status=N_INIT, s, title[MAX_WIDTH]:STRING,
  36.       empty=TRUE, top, bot, ownout=TRUE
  37.   utilitybase:=OpenLibrary('utility.library', 37)
  38.   s, arg:=get_word(arg)
  39.   IF (fh:=as_Open(s, OLDFILE, 3, 8*1024))=NIL THEN Raise(ERR_FILE)
  40.   IF arg[]
  41.     s:=get_word(arg)
  42.     IF s[]
  43.       outh:=Open(s, NEWFILE)
  44.     ENDIF
  45.   ENDIF
  46.   IF outh=NIL
  47.     WriteF('')
  48.     outh:=stdout
  49.     ownout:=FALSE
  50.   ENDIF
  51.   top:='\n--------------------------------------' +
  52.        '--------------------------------------\n'
  53.   bot:='======================================' +
  54.        '======================================\n'
  55.   WHILE as_FGetS(fh, in, MAX_LINE_LEN)
  56.     SELECT NODE_STATES OF status
  57.     CASE N_INIT
  58.       IF Strnicmp(in, '@DATABASE', STRLEN)<>CMP_EQUAL
  59.         Raise(ERR_DATA)
  60.       ELSE
  61.         status:=N_OUT
  62.       ENDIF
  63.     CASE N_OUT
  64.       IF Strnicmp(in, '@NODE ', STRLEN)=CMP_EQUAL
  65.         status:=N_IN
  66.     parse_node_line(in+STRLEN, title)
  67.         empty:=TRUE
  68.       ENDIF
  69.     CASE N_IN
  70.       IF empty AND (Strnicmp(in, '@TITLE', STRLEN)=CMP_EQUAL)
  71.     parse_title_line(in+STRLEN, title)
  72.       ELSEIF Strnicmp(in, '@ENDNODE', STRLEN)=CMP_EQUAL
  73.         Fputs(outh, bot)
  74.     status:=N_OUT
  75.       ELSE
  76.         IF CtrlC() THEN Raise(ERR_BRK)
  77.         s:=TrimStr(in)
  78.         IF Not(empty AND (s[]=0))
  79.           IF empty
  80.             write_ansi(TITLE)
  81.             Fputs(outh, title)
  82.             write_ansi(TITLE, FALSE)
  83.             Fputs(outh, top)
  84.             empty:=FALSE
  85.           ENDIF
  86.           output(in)
  87.         ENDIF
  88.       ENDIF
  89.     ENDSELECT
  90.   ENDWHILE
  91. EXCEPT DO
  92.   SELECT NUM_ERRS OF exception
  93.   CASE ERR_LIB
  94.     WriteF('Could not open utility.library\n')
  95.   CASE ERR_FILE
  96.     WriteF('Could not open file "\s"\n', s)
  97.   CASE ERR_DATA
  98.     WriteF('"\s" is not an AmigaGuide file\n')
  99.   CASE ERR_BRK
  100.     WriteF('User aborted\n')
  101.   ENDSELECT
  102.   IF ownout AND outh THEN Close(outh)
  103.   IF fh THEN as_Close(fh)
  104.   IF utilitybase THEN CloseLibrary(utilitybase)
  105. ENDPROC
  106.  
  107. PROC output(line)
  108.   DEF status=A_INIT, gotbrac, c
  109.   IF line[]="@" THEN IF line[1]<>"{" THEN RETURN
  110.   WHILE c:=line[]
  111.     SELECT c
  112.     CASE "\\"
  113.       IF status=A_INIT
  114.         status:=A_IGNORE
  115.       ELSE
  116.         statecopy(status)
  117.         FputC(outh, c)
  118.         status:=A_INIT
  119.       ENDIF
  120.       line++
  121.     CASE "@"
  122.       IF status=A_INIT
  123.         status:=A_AT
  124.       ELSE
  125.         IF status<>A_IGNORE THEN statecopy(status)
  126.         FputC(outh, c)
  127.         status:=A_INIT
  128.       ENDIF
  129.       line++
  130.     CASE "{"
  131.       IF status=A_AT
  132.         status:=A_BRAC
  133.       ELSE
  134.         statecopy(status)
  135.         FputC(outh, c)
  136.         status:=A_INIT
  137.       ENDIF
  138.       line++
  139.     CASE "}"
  140.       SELECT AT_STATES OF status
  141.       CASE A_BRAC, A_END
  142.       DEFAULT
  143.         statecopy(status)
  144.         FputC(outh, c)
  145.       ENDSELECT
  146.       status:=A_INIT
  147.       line++
  148.     DEFAULT
  149.       SELECT AT_STATES OF status
  150.       CASE A_BRAC
  151.         line,gotbrac:=parse_at_line(line)
  152.         status:=IF gotbrac THEN A_INIT ELSE A_END
  153.       CASE A_END
  154.         line++
  155.       DEFAULT
  156.         statecopy(status)
  157.         FputC(outh, c)
  158.         status:=A_INIT
  159.         line++
  160.       ENDSELECT
  161.     ENDSELECT
  162.   ENDWHILE
  163. ENDPROC
  164.  
  165. PROC statecopy(state)
  166.   SELECT AT_STATES OF state
  167.   CASE A_IGNORE
  168.     FputC(outh, "\\")
  169.   CASE A_AT
  170.     FputC(outh, "@")
  171.   CASE A_BRAC
  172.     Fputs(outh, '@{')
  173.   ENDSELECT
  174. ENDPROC
  175.  
  176. PROC parse_at_line(line)
  177.   DEF first, second, third, gotbrac, i=0, on=TRUE, c
  178.   first,line,gotbrac:=get_word(line, TRUE)
  179.   IF first[]
  180.     i:=1
  181.     IF gotbrac=FALSE
  182.       second,line,gotbrac:=get_word(line, TRUE)
  183.       IF second[]
  184.         i:=2
  185.         IF gotbrac=FALSE
  186.           third,line,gotbrac:=get_word(line, TRUE)
  187.           IF third[] THEN i:=3
  188.         ENDIF
  189.       ENDIF
  190.     ENDIF
  191.   ENDIF
  192.   SELECT 4 OF i
  193.   CASE 1
  194.     IF ToUpper(first[])="U"
  195.       on:=FALSE
  196.       first++
  197.     ENDIF
  198.     c:=ToUpper(first[])
  199.     SELECT c
  200.     CASE "B"
  201.       write_ansi(BOLD, on)
  202.     CASE "I"
  203.       write_ansi(ITALIC, on)
  204.     ENDSELECT
  205.   CASE 2
  206.     IF Stricmp(first, 'FG')=CMP_EQUAL
  207.       IF Stricmp(second, 'HIGHLIGHT')=CMP_EQUAL
  208.         write_ansi(HIGHLIGHT)
  209.       ELSEIF Stricmp(second, 'TEXT')=CMP_EQUAL
  210.         write_ansi(HIGHLIGHT, FALSE)
  211.       ENDIF
  212.     ELSEIF (Stricmp(second, 'CLOSE')=CMP_EQUAL) OR
  213.            (Stricmp(second, 'QUIT')=CMP_EQUAL)
  214.       write_ansi(OTHER)
  215.       Fputs(outh, first)
  216.       write_ansi(OTHER, FALSE)
  217.     ENDIF
  218.   CASE 3
  219.     IF (Stricmp(second, 'LINK')=CMP_EQUAL) OR
  220.        (Stricmp(second, 'ALINK')=CMP_EQUAL)
  221.       write_ansi(F_LINK)
  222.       Fputs(outh, first)
  223.       write_ansi(F_LINK, FALSE)
  224.     ELSE
  225.       write_ansi(OTHER)
  226.       Fputs(outh, first)
  227.       write_ansi(OTHER, FALSE)
  228.     ENDIF
  229.   ENDSELECT
  230. ENDPROC line,gotbrac
  231.  
  232. PROC parse_node_line(line, title)
  233.   DEF first, second
  234.   first,line:=get_word(line)
  235.   second,line:=get_word(line)
  236.   IF first[]
  237.     IF second[]
  238.       StrCopy(title, second)
  239.     ELSE
  240.       StrCopy(title, first)
  241.     ENDIF
  242.   ENDIF
  243. ENDPROC
  244.  
  245. PROC parse_title_line(line, title)
  246.   DEF first
  247.   first,line:=get_word(line)
  248.   IF first[]
  249.     StrCopy(title, first)
  250.   ENDIF
  251. ENDPROC
  252.  
  253. CONST L_SIZE=35
  254.  
  255. PROC get_word(line, chkbrac=FALSE)
  256.   DEF status=L_INIT, noword=TRUE, foundbrac=FALSE,
  257.       t=NIL, to, special=FALSE
  258.   to:=line
  259.   WHILE line[] AND noword
  260.     IF to<>line THEN to[]:=line[]
  261.     SELECT L_SIZE OF line[]
  262.     CASE "\q"
  263.       IF special
  264.         to++
  265.       ELSE
  266.         SELECT LINE_STATES OF status
  267.         CASE L_INIT
  268.           status:=L_QUOTED
  269.           t:=line+1
  270.           to++
  271.         CASE L_QUOTED
  272.           to[]:=0
  273.           noword:=FALSE
  274.         DEFAULT
  275.           to++
  276.         ENDSELECT
  277.       ENDIF
  278.     CASE "\n", "\t", " "
  279.       IF status=L_SPACED
  280.         to[]:=0
  281.         noword:=FALSE
  282.       ELSE
  283.         to++
  284.       ENDIF
  285.     DEFAULT
  286.       IF chkbrac AND (line[]="}")
  287.         to[]:=0
  288.         noword:=FALSE
  289.         foundbrac:=TRUE
  290.       ELSE
  291.         IF status=L_INIT
  292.           t:=line
  293.           status:=L_SPACED
  294.         ENDIF
  295.         to++
  296.       ENDIF
  297.     ENDSELECT
  298.     IF special
  299.       special:=FALSE
  300.     ELSEIF line[]="\\"
  301.       special:=TRUE
  302.       to--
  303.     ENDIF
  304.     line++
  305.   ENDWHILE
  306. ENDPROC t,line,foundbrac
  307.